14
תגובות
יש לי בסיס נתונים שמחזיק רשימה של משתמשים. אני רוצה כל פעם לקבל ממנו רשימה של חברים ורשימה של לא חברים. ניתן לדעת אם אדם חבר ע"פ מערך של id's של חברים שניתן להשוות למה שאנו מקבלים.
דרך ראשונה:
שליפה של כל התוצאות מהטבלה (SELCET *) ואז foreach דרך המערך ומיון דרך in_array. אם נמצא בתוך המערך של id's של חברים - חבר, ואם לא - לא חבר.
דרך שניה:
שליפה מותנית של חברים בלבד ע"י SELECT IN, כך שהוא שולף לי רק חברים ואז עוד שליפה של "לא חברים" בצורה אחרת (לא ממש חשבתי על זה...) אולי שליפה של הכל (SELECT *) ואז מחיקה של ערכים עם UNSET,ז"א כל הערכים שנמצאים כבר במערך של החברים, כך שהוא משאיר לי רק "לא חברים".

או שאולי יש דרך אחרת יעילה יותר שעדיין לא חשבתי עליה??

תודה רבה מראש.

14 תשובות

avatar ענה OrelBeY ב 28 לאפריל 2013 #

שתי הדרכים לא יעילות ברמה מטורפת, אבל הבעיה היא במבנה של בסיס הנתונים. אם יש לך את האפשרות לשנות את זה (ואז סביר להניח שתצטרך לשנות חלקים בקוד שנסמכים על זה) - פשוט תוסיף עמודה ב"משתמשים" שהיא תקבע אם המשתמש חבר או לא. אם יש מידע נוסף לכל "חבר", כן תוסיף טבלה חדשה, אבל אז לפחות תדע מי החברים לפי העמודה החדשה.
הרבה זמן לא באמת כתבתי קוד, בייחוד לא SQL, ושכחתי חצי מהדברים.
אבל אני כן זוכר שאתה יכול להשתמש ב-Join (אם אתה לא יכול לשנות את זה).

avatar ענה astn ב 28 לאפריל 2013 #

הבעיה היא שהמערך שקובע אם מישהו חבר או לא הוא דינמי - הוא משתנה לפי המשתמש שמחובר, אני שולף אותו מפייסבוק.
אני בעצם מנסה לסנכרן בין רשימת החברים מפייסבוק לרשימת המשתמשים אצלי. לכן אני לא יכול להוסיף עמודה. אין לי עוד מידע על כל חבר. לפחות לא משהו שאני צריך לשמור.
תודה.

avatar ענה ldbrgr ב 29 לאפריל 2013 #

תסביר מה אתה מנסה לעשות אולי יש דרך טובה יותר..

avatar ענה astn ב 01 למאי 2013 #

יש לי DB של אנשים מפייסבוק, אני מזהה אותם ע"פ הID שלהם בפייסבוק.
נאמר שאדם חדש מגיע. אני רוצה להראות לו את כל האנשים שנמצאים אצלי והם גם חברים שלו בפייסבוק. אני בעצם צריך לסנכרן בין מערך של חברים שאני מקבל מהAPI ובין התוצאות של ה SQL.
מה הדרך הטובה ביותר? אני מניח ששלי (מה שכתבתי למעלה) היא לא. האם כדאי פשוט לשמור בDB שלי רשימה של חברים שגם נמצאים אצלי לכל אדם ואז לעדכן את זה כל פעם שמישהו חדש נכנס?

avatar ענה intval ב 01 למאי 2013 #

תעשה טבלה רבים-ל-רבים של חברים לפי fbid
fbid | friendfbid

כשמתמש נכנס בפעם הראשונה - הכנס לטבלה הזו הרבה שורות לפי הנתונים שאתה מקבל מפייסבוק.
כל פעם שאתה רוצה להנסכרן מחדש את רשימת החברים שיש לך במערכת עם הרשימה של המשתמשים מפייסבוק - תמחוק את כל השורות ששייכות לאותו משתמש ותכניס אותם מחדש.

בטבלה של משתמשים רשומים תוסיף עמודה בשם fbid
שלפיה אחרך כך תוכל לשלוף.

כשאתה מקבל מפייסבוק את רשימת הID של החברים תוכל להשתמש ברשימה הזאת עבור שאילתת IN.


select * from friends2friends
where fbid = $myfbid
and friendFbId in ($listOfIdsFromFacebook)
left join users
on user.fbid = friends2friends.friendFbId

avatar ענה dekelyi ב 01 למאי 2013 #

לפייסבוק יש את FQL שמאפשר לעשות את זה בקלות..

SELECT uid1 FROM friend WHERE uid2 = me();

זה יחזיר לך ID'S של כל המשתמשים שחברים שלך (כאשר הפונקציה me() מחזירה את הID של המשתמש המחובר)(אפשר גם לשים במקום ID ולא את הפונקציה ME)
בשביל להוציא מידע של הפרופיל על החברים תשתמש בשאליתת IN.
SELECT name FROM user WHERE uid IN(SELECT uid1 FROM friend WHERE uid2 = me());

avatar ענה astn ב 01 למאי 2013 #

@intval

אתה אומר שכדאי פשוט ליצור עוד טבלה עם החברים של כל משתמש שקיימים גם אצלי? ז"א לחסוך כל פעם את המיון של האנשים ולבחור לסנכרן רק מדי פעם?
הבנתי נכון?

avatar ענה intval ב 01 למאי 2013 #

למען האמת אתה יכול בעת ההתחברות של המשתמש למערכת לשלוף את רשימת החברים מפייסבוק (כמו שהציאה dekel) ולשמור אותה בסשן או שקאש כלשהו ואז לא צריך לשמור ולסנכרן טבלה כזו.

avatar ענה astn ב 01 למאי 2013 #

זה לא ענה על השאלה של מתי לעשות סינכרון בין הרשימה של היוזרים שיש לי לבין רשימת החברים שלו. או שבעצם אתה אומר שכדאי לעשות סינכרון כזה פעם אחת בכל התחברות ולשמור מערך של id's בסשן? מערך של id's שהם גם חברים של היוזר וגם נמצאים אצלי ז״א.

avatar ענה dekelyi ב 01 למאי 2013 #

למה לשמור בסשן? זה הורס את החוויה של "לא צריך להסתמך על מה שיש לך עכשיו"..
כל פעם שאתה צריך תבדוק מחדש.

avatar ענה astn ב 01 למאי 2013 #

לעבור על שני מערכים דו מימדיים של מאות פרטים ולמצוא זהויות כל פעם מחדש? זה בזבוז משאבים ענק...

avatar ענה intval ב 01 למאי 2013 #

מספיק אחת לחיבור. לא מתווספים כל כך הרבה חברים חדשים לאנשים בפייסבוק בזמן שהם עושים דברים באתר אחר.

avatar ענה astn ב 01 למאי 2013 #

שאלה נוספת. האם כדאי להעביר HTML בAJAX או להעביר JSON ואז ליצור את הHTML בצד הלקוח?

avatar ענה dekelyi ב 01 למאי 2013 #

אני מאמין שהשרת צריך רק להעביר מידע והלקוח מציג אותו איך שהוא רוצה.
אז לשאלתך, להעביר את המידע שJSON